package com.filldream.fastboot.core.thread;

import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 用于获取自定义线程池
 * 1、使用枚举类型单例模式规避线程安全问题
 * 2、使用枚举类型规避@Configuration标注类的使用麻烦问题
 * 3、禁止修改单例成员属性
 * 4、废弃老版本的ThreadPoolExecutorUtil类
 * 5、请用户使用前自定义线程池参数
 * @author RickSun
 * @date 2019年10月31日18:16:47
 * @date 2023年10月16日16:26:47
 */
@Getter
@AllArgsConstructor
public enum ThreadPoolUtil {

    //项目核心线程池
    R(  new ThreadPoolExecutor(
            12,
            30,
            60,
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(50),
            new TheadFactoryName("PRO_T"),
            //队列与线程池中线程都满了时使用调用者所在的线程来执行
            new ThreadPoolExecutor.CallerRunsPolicy()
    )),

    //定时任务线程池
    J(  new ThreadPoolExecutor(
            3,
            21,
            120,
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(35),
            new TheadFactoryName("JOB_T"),
            //队列与线程池中线程都满了时使用调用者所在的线程来执行
            new ThreadPoolExecutor.CallerRunsPolicy()
    ));

    private ExecutorService executor;
}